---
id: benchmark
title: 29.3 基准测试
sidebar_label: 29.3 基准测试
---

import useBaseUrl from "@docusaurus/useBaseUrl";

## 29.3.1 基准测试

基准测试（benchmarking）是一种测量和评估软件性能指标的活动。你可以在某个时候通过基准测试建立一个已知的性能水平（称为基准线），当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。这是基准测试最常见的用途。其他用途包括测定某种负载水平下的性能极限、管理系统或环境的变化、发现可能导致性能问题的条件，等等。

## 29.3.2 基准测试特质及意义

### 29.3.2.1 特质

- **可重复性**：可进行重复性的测试，这样做有利于比较每次的测试结果，得到性能结果的长期变化趋势，为系统调优和上线前的容量规划做参考。
- **可观测性**：通过全方位的监控（包括测试开始到结束，执行机、服务器、数据库），及时了解和分析测试过程发生了什么。
- **可展示性**：相关人员可以直观明了的了解测试结果（web 界面、仪表盘、折线图树状图等形式）。
- **真实性**：测试的结果反映了客户体验到的真实的情况（真实准确的业务场景+与生产一致的配置+合理正确的测试方法）。
- **可执行性**：相关人员可以快速的进行测试验证修改调优（可定位可分析）。

### 29.3.2.2 意义

- 为容量规划确定系统和应用程序的极限；
- 为配置测试的参数和配置选项提供参考依据；
- 为验收测试确定系统是否具备自己所宣称的能力；
- 为性能基线的建立提供长期的数据统计来源以及比较基准；

## 29.3.3 `BenchmarkDotNet`

`BenchmarkDotNet` 是 `.NET` 平台提供的基准测试工具，`BenchmarkDotNet` 可帮助您将方法转换为基准，跟踪其性能，并共享可重复的测量实验。`BenchmarkDotNet` 可保护您免受流行的基准测试错误，并在基准设计或获得的测量中出现问题时警告您。结果以用户友好的形式呈现，突出显示了有关实验的所有重要事实。

### 29.3.3.1 如何使用

创建一个 `控制台` 应用程序，并通过 `Nuget` 安装 [BenchmarkDotNet](https://www.nuget.org/packages/BenchmarkDotNet/) 拓展包。编写测试：

```cs {3-4,22,25,33}
using System;
using System.Security.Cryptography;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

namespace MyBenchmarks
{
    public class Md5VsSha256
    {
        private const int N = 10000;
        private readonly byte[] data;

        private readonly SHA256 sha256 = SHA256.Create();
        private readonly MD5 md5 = MD5.Create();

        public Md5VsSha256()
        {
            data = new byte[N];
            new Random(42).NextBytes(data);
        }

        [Benchmark]
        public byte[] Sha256() => sha256.ComputeHash(data);

        [Benchmark]
        public byte[] Md5() => md5.ComputeHash(data);
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<Md5VsSha256>();
        }
    }
}
```

### 29.3.3.2 查看结果

运行控制器程序，将得到以下结果

```
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
  [Host]       : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
  Net472       : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
  NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
  CoreRt30     : .NET CoreRT 1.0.28231.02 @Commit: 741d61493c560ba96e8151f9e56876d4d3828489, X64 AOT
  Mono         : Mono 6.4.0 (Visual Studio), X64
```

| Method | Runtime       | N     |       Mean |     Error |    StdDev | Ratio |
| ------ | ------------- | ----- | ---------: | --------: | --------: | ----: |
| Sha256 | .NET 4.7.2    | 1000  |   7.735 us | 0.1913 us | 0.4034 us |  1.00 |
| Sha256 | .NET Core 3.0 | 1000  |   3.989 us | 0.0796 us | 0.0745 us |  0.50 |
| Sha256 | CoreRt 3.0    | 1000  |   4.091 us | 0.0811 us | 0.1562 us |  0.53 |
| Sha256 | Mono          | 1000  |  13.117 us | 0.2485 us | 0.5019 us |  1.70 |
|        |               |       |            |           |           |       |
| Md5    | .NET 4.7.2    | 1000  |   2.872 us | 0.0552 us | 0.0737 us |  1.00 |
| Md5    | .NET Core 3.0 | 1000  |   1.848 us | 0.0348 us | 0.0326 us |  0.64 |
| Md5    | CoreRt 3.0    | 1000  |   1.817 us | 0.0359 us | 0.0427 us |  0.63 |
| Md5    | Mono          | 1000  |   3.574 us | 0.0678 us | 0.0753 us |  1.24 |
|        |               |       |            |           |           |       |
| Sha256 | .NET 4.7.2    | 10000 |  74.509 us | 1.5787 us | 4.6052 us |  1.00 |
| Sha256 | .NET Core 3.0 | 10000 |  36.049 us | 0.7151 us | 1.0025 us |  0.49 |
| Sha256 | CoreRt 3.0    | 10000 |  36.253 us | 0.7076 us | 0.7571 us |  0.49 |
| Sha256 | Mono          | 10000 | 116.350 us | 2.2555 us | 3.0110 us |  1.58 |
|        |               |       |            |           |           |       |
| Md5    | .NET 4.7.2    | 10000 |  17.308 us | 0.3361 us | 0.4250 us |  1.00 |
| Md5    | .NET Core 3.0 | 10000 |  15.726 us | 0.2064 us | 0.1930 us |  0.90 |
| Md5    | CoreRt 3.0    | 10000 |  15.627 us | 0.2631 us | 0.2461 us |  0.89 |
| Md5    | Mono          | 10000 |  30.205 us | 0.5868 us | 0.6522 us |  1.74 |

### 29.3.3.3 导出报表

也可以导出各种图表

<img src={useBaseUrl("img/bm1.png")} />

## 29.3.4 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::

---

:::note 了解更多

想了解更多 `BenchmarkDotNet` 知识可查阅 [BenchmarkDotNet 官网](https://benchmarkdotnet.org/)。

:::
